# -*- coding: utf-8 -*-
"""
Created: Wed Apr 10 19:29:14 2024
Author: w'm'h001 (Python 3.8)

Description:
"""
# 1.1 算法与算法思想
# 对物理系统建模

# 1.1.1 算法思想
# 算法思想的开端：将长的操作步骤分解为小的、清晰的子步骤，以及处理可预期意外情况的操作

# 低层计算机程序使用机器语言提供指令
# 高层系统可以理解很多通用任务

# Python是一种高级语言，具有进行数学计算、文本处理、文件操作等的通用操作命令
# Python还可以访问很多标准程序库、第三方模块，可用于执行数据可视化、图像处理等高级功能

# C、C++、Fortran等很多科学计算中使用的语言所编写的程序在执行前需要进行编译，
#     由一个称为编译器的程序将代码转译为低级语言，编译生成的程序才能被执行
# Python编写的大部分程序可以直接执行，由一个称为解释器的程序让计算机理解代码，
#     解释器还提供命令行接口，可以逐条输入命令，回车立刻执行刚输入的命令

# Python解释器、标准函数库、第三方模块和自编程序一起搭建了便利、强大的科学计算平台

# 1.1.2 状态
# 算法可以视为一个指令链，每个指令都描述了一个基本操作，算法描述的所有操作共同实现一个任务
# 指令可能是繁琐、重复、难以理解和编写的，在编程语言的帮助下，用户可以编写能够自动转化为指令
#     链的简单的代码
# 在算法运行过程中，计算机的状态时常会发生改变，如内存中的数据等

# 1.1.3 "a=a+1"是什么意思
# 变量<>=值<>
# 将值赋值给变量，即改变变量的状态，将变量名指向存储数据的存储空间
# 具体过程为先对赋值号右边求值，再创建一个对象用于存储该值，然后将变量绑定到该对象
# 变量的类型为值的字面类型
# Python中，变量在首次赋值时定义并初始化
# Python中，赋值符右侧如果是表达式会先令该表达式求值，再赋值，因此右侧不能出现未定义变量，
#     故Python本身不支持符号计算，该功能的实现依赖第三方模块

# Python中，存储数据的存储空间与变量是两个不同的实体，且并非一一绑定关系
# Python中，存储列表和np数组等数据的存储空间与变量的映射关系并非仅为一对一，而是可以一对多.
#     将列表变量或np数组变量赋值给另一个变量可以使后一个变量指向前一个变量所指向的存储空间。
#     此时，对两个变量的操作本质上为对同一个列表或np数组数据的操作。这样的赋值相当于给列表
#     或np数组变量起别名，对两个变量的操作相互影响，直至其中一个变量被重新赋值

import numpy as np

# 两个变量指向同一个np数组
x = np.zeros(10)
# x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
y = x
x[1] = 1
y[0] = x[0] + 1
print("x={}\ny={}".format(x, y))

# 对np数组进行操作并重新赋值给变量后，为运算产生的新np数组申请新的存储空间，二者解除相互影响
#     的状态
x = np.zeros(10)
# x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
y = x
y = y + 1
# y = sorted(y)
# y[1] = 1
print("x={}\ny={}".format(x, y))

# 对于列表变量，使用切片可用创建与原列表变量元素相等、顺序相同的新列表变量（原列表的拷贝）
x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
y = x[:]
x[1] = 1
y[0] = 1
print("x={}\ny={}".format(x, y))

# 对于np数组变量，使用切片的效果与直接赋值相同，可用copy方法创建原列表的拷贝
# numpy.ndarray（np数组）实例.copy()
# 返回新创建的与原np数组实例元素相等、顺序相同的numpy.ndarray实例（原列表的拷贝）
w = np.zeros(10)
x = w
y = x[:]
z = y.copy()
y[0] = 1
z[1] = 1
print("w={}\nx={}\ny={}\nz={}".format(w, x, y, z))

# 加数1<>+加数2<>
# 加数1和加数2均为数字时，返回两个数字的和；
#     加数1和加数2均为字符串时，返回两个字符串拼接产生的新字符串实例，加数1在前，加数2在后
a = 100
a = a + 1
print(a)

# 量1<>==量2<>
# 返回表示两个量是否相等的布尔值
a = 1
print(a == 0)
b = a == 1
print(b)

# 1.1.4 符号和数字的对比
# Python本身不支持符号计算
# Python中，=用于赋值而非定义函数
# 变量符号并非永久与某个数据绑定，变量可以重新赋值，变量当前存储的数据为最近一次赋值给该变量
#     的数据
